﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;

namespace Cinser.Common.Silverlight.DT
{
    /*
     * DataRow对象控制器
     * 实现DataRow对象的添加删除功能
     * */
    public class DMPRowCollection : IEnumerable
    {
        //构造
        public DMPRowCollection()
        {
            this.listRow = new List<DMPDataRow>();
        }

        #region 方法

        /// <summary>
        /// 将指定的 DataRow 添加到 DataRowCollection 对象中。
        /// </summary>
        /// <param name="row">要添加的 DataRow。</param>  
        public void Add(DMPDataRow row)
        {
            if (row==null)
            {
                throw new InvalidOperationException("value is null");
            }
            //不检查规则过时

            listRow.Add(row);
        }


        /// <summary>
        /// 插入DataRow到指定位置
        /// </summary>
        /// <param name="row">DataRow</param>
        /// <param name="index">位置索引</param>
        public void InsertAt(DMPDataRow row, int index)
        {
            if (row == null)
            {
                throw new InvalidOperationException("value is null");
            }
            listRow.Insert(index,row);
        }

        /// <summary>
        /// 获取指定 DataRow 对象的索引
        /// </summary>
        /// <param name="row">要搜索的 DataRow</param>
        /// <returns>索引</returns>
        public int IndexOf(DMPDataRow row)
        {
            return listRow.IndexOf(row);
        }





        /// <summary>
        /// 从集合中移除指定的 DataRow。
        /// </summary>
        /// <param name="row">要移除的 DataRow。</param>
        public void Remove(DMPDataRow row)
        {
            listRow.Remove(row);
        }


        /// <summary>
        /// 从集合中移除指定索引处的行。
        /// </summary>
        /// <param name="index">要移除的行的索引。</param>
        public void RemoveAt(int index)
        {
            listRow.RemoveAt(index);
        }


        /// <summary>
        /// 清除所有行的集合。
        /// </summary>
        public void Clear()
        {
            listRow.Clear();
        }

        #region 索引

        public DMPDataRow this[int index]
        {
            get
            {
                return listRow[index];
            }
        }

        #endregion


        /// <summary>
        /// 删除的所有Rows中的指定列
        /// </summary>
        /// <param name="index">索引</param>
        internal void RemoveByColumn(int index)
        {
            foreach(DMPDataRow r in listRow)
            {
                r.Remove(index);
            }
        }


        /// <summary>
        /// 插入obj到指定的所有列
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="index"></param>
        internal void InsertToByColumn(object obj,int index)
        {
            foreach (DMPDataRow r in listRow)
            {
                r.InsertTo(obj, index);
            }
        }

        #endregion

        #region  属性
        /// <summary>
        /// 行的数量
        /// </summary>
        public int Count
        {
            get
            {
                return listRow.Count;
            }
        }


        #endregion

        private List<DMPDataRow> listRow=new List<DMPDataRow>();


        //实现对foreach的支持
        //////////////////////////////////////////////////////////////////////////
        public IEnumerator GetEnumerator()
        {
            return new RowClloectionEnumerator(this);
        }
        private class RowClloectionEnumerator :  IEnumerator
        {
            public RowClloectionEnumerator(DMPRowCollection r)
            {
                this.rowCollection = r;
            }
            private int positon = -1;
            private DMPRowCollection rowCollection;
            public bool MoveNext()
            {
                
                if (positon < rowCollection.listRow.Count - 1)
                {
                    positon++;
                    return true;
                }
                return false;
            }
            public void Reset()
            {
                positon = -1;
            }
            public object Current
            {
                get
                {
                    return rowCollection.listRow[positon];
                }
            }

        }
        //////////////////////////////////////////////////////////////////////////

    }
}
